package team.cloud.k8s;

import io.fabric8.kubernetes.api.model.ConfigMap;
import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
import io.fabric8.kubernetes.api.model.ConfigMapList;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class K8sConfigMaps {
    private static final Logger logger = LogManager.getLogger(K8sConfigMaps.class);

    public boolean deleteConfigMap(KubernetesClient client, String namespaceName, String configMapName) {
        try {
            client.configMaps().inNamespace(namespaceName).withName(configMapName).delete();
            logger.info("deleteConfigMap成功");
            return true;
        } catch (KubernetesClientException e) {
            logger.error("deleteConfigMap失败");
            logger.error("错误信息：", e.getMessage());
            return false;
        }
    }

    public boolean deleteConfigMaps(KubernetesClient client, String namespaceName) {
        try {
            client.configMaps().inNamespace(namespaceName).delete();
            logger.info("deleteConfigMaps成功（namespace下）");
            return true;
        } catch (KubernetesClientException e) {
            logger.error("deleteConfigMaps失败（namespace下）");
            logger.error("错误信息：", e.getMessage());
            return false;
        }
    }

    public boolean deleteAllConfigMaps(KubernetesClient client) {
        try {
            client.configMaps().inAnyNamespace().delete();
            logger.info("deleteConfigMaps成功(全局)");
            return true;
        } catch (KubernetesClientException e) {
            logger.error("deleteConfigMaps失败(全局)");
            logger.error("错误信息：", e.getMessage());
            return false;
        }

    }

    public ConfigMap getConfigMap(KubernetesClient client, String namespaceName, String configMapName) {
        try {
            logger.info("getConfigMap成功");
            return client.configMaps().inNamespace(namespaceName).withName(configMapName).get();
        } catch (KubernetesClientException e) {
            logger.error("getConfigMap失败");
            logger.error("错误信息：", e.getMessage());
            return null;
        }
    }

    public ConfigMapList listConfigMapsFromNamespace(KubernetesClient client, String namespaceName) {
        try {
            logger.info("getConfigMap成功");
            return client.configMaps().inNamespace(namespaceName).list();
        } catch (KubernetesClientException e) {
            logger.error("getConfigMap失败");
            logger.error("错误信息：", e.getMessage());
            return null;
        }
    }

    public ConfigMapList listConfigMaps(KubernetesClient client) {
        try {
            logger.info("listConfigMaps成功");
            return client.configMaps().list();
        } catch (KubernetesClientException e) {
            logger.error("listConfigMaps失败");
            logger.error("错误信息：", e.getMessage());
            return null;
        }
    }

    public boolean createConfigMap(KubernetesClient client, ConfigMap configMap) {
        String apiVersion = configMap.getApiVersion();
        String kind = "ConfigMap";
        String namespace = configMap.getMetadata().getNamespace();
        String name = configMap.getMetadata().getName();
        Map<String, String> labels = configMap.getMetadata().getLabels();
        Map<String, String> data = configMap.getData();

        try {

            ConfigMap createConfigMap = new ConfigMapBuilder()
                    .withApiVersion(apiVersion)
                    .withKind(kind)
                    .withNewMetadata()
                    .withName(name)
                    .withNamespace(namespace)
                    .withLabels(labels)
                    .endMetadata()
                    .withData(data)
                    .build();
            logger.error("createConfigMap成功");
            client.configMaps().inNamespace(namespace).create(createConfigMap);
            return true;

        } catch (KubernetesClientException e) {
            logger.error("createConfigMap失败");
            logger.error("错误信息：", e.getMessage());
            e.printStackTrace();
            return false;
        }

    }
//    public boolean updateAllConfigMaps(KubernetesClient client,ConfigMap configMap)
//        {
//        try
//        {
//            HasMetadataOperation hasMetadataOperation = (HasMetadataOperation)client.configMaps();
//            hasMetadataOperation.patch(configMap);
//            logger.info("更新成功");
//            return true;
//        }
//        catch (KubernetesClientException e)
//        {
//            logger.error("更新失败");
//            logger.error("错误信息：",e.getMessage());
//            return false;
//        }
//
//    }
}
